﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Configuration;
using BackEndSystemWebTv.Enums;


namespace BackEndSystemWebTv.DAL
{
    public class DataAccessLayer
    {
        private static DataAccessLayer instance;
        DatabaseEntities db;
        private DataSet Logs;


        private DataAccessLayer()
        {
        }

        /// <summary>
        /// Singleton
        /// </summary>
        public static DataAccessLayer Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new DataAccessLayer();
                    return instance;
                }
                else
                    return instance;
            }
        }

        /// <summary>
        /// Toevoegen van een nieuwe gebruiker
        /// </summary>
        public EGebruikerToevoegen NieuweGebruikerToevoegen(string voornaam,
            string achternaam, string gebruikersnaam, string wachtwoord, string email, bool isAdmin)
        {

            db = new DatabaseEntities();
            Gebruiker gebruiker = new Gebruiker();
            gebruiker.Gebruikersnaam = gebruikersnaam;
            gebruiker.Voornaam = voornaam;
            gebruiker.Achternaam = achternaam;
            gebruiker.Wachtwoord = wachtwoord;
            gebruiker.Email = email;
            gebruiker.IsAdmin = isAdmin;

                if (!controleerBestaandeNaam(gebruikersnaam))
                {
                    return EGebruikerToevoegen.GebruikersnaamBestaatAl;
                }
                else if (!controleerBestaandeMail(email))
                {
                    return EGebruikerToevoegen.EmailBestaatAl;
                }
                else
                {
                    db.AddToGebruikers(gebruiker);
                    db.SaveChanges();
                    return EGebruikerToevoegen.Succes;
                }
        }

        /// <summary>
        /// Lijst ophalen van huidige gebruikers
        /// </summary>
        /// <returns></returns>
        public List<List<string>> GebruikersLijstOphalen()
        {
            db = new DatabaseEntities();
            List<List<string>> gLijst = new List<List<string>>();
            List<string> gInfo;
            var gebruikers = from g in db.Gebruikers select g;

            foreach (var g in gebruikers)
            {
                gInfo = new List<string>();
                gInfo.Add(g.Gebruikersnaam + ", ");
                gInfo.Add(g.Voornaam + " ");
                gInfo.Add(g.Achternaam + ", ");
                gInfo.Add(g.Email + ", ");
                if (g.IsAdmin)
                    gInfo.Add("Admin");
                else
                    gInfo.Add("Geen admin");
                gLijst.Add(gInfo);
            }
            return gLijst;
        }

        /// <summary>
        /// Gebruiker verwijderen.
        /// </summary>
        /// <param name="gebruikersnaam"></param>
        /// <returns></returns>
        public EGebruikerVerwijderen BestaandeGebruikerVerwijderen(string gebruikersnaam)
        {
            db = new DatabaseEntities();
            db.Gebruikers.DeleteObject(db.Gebruikers.First(g => g.Gebruikersnaam == gebruikersnaam));
            db.SaveChanges();
            return EGebruikerVerwijderen.Succes;
        }

        /// <summary>
        /// Controleert of Email al in de database bestaat
        /// </summary>
        /// <param name="email"></param>
        /// <returns></returns>
        private bool controleerBestaandeMail(string email)
        {
            var emails = from g in db.Gebruikers where g.Email == email select g.Email;

            foreach (var e in emails)
            {
                if (e == email)                
                    return false;                                
            }
            return true;
        }


        /// <summary>
        /// Controleert of de gebruikersnaam al in de database bestaat
        /// </summary>
        /// <param name="gebruikersnaam"></param>
        /// <returns></returns>
        private bool controleerBestaandeNaam(string gebruikersnaam)
        {
            var vergelijk = from g in db.Gebruikers where g.Gebruikersnaam == gebruikersnaam select g.Gebruikersnaam;

            foreach (var g in vergelijk)
            {
                if (g == gebruikersnaam)
                    return false;
            }
            return true;
        }

        /// <summary>
        /// Maakt een log aan voor gebruiker.
        /// </summary>
        /// <param name="gebruikersnaam"></param>
        /// <returns></returns>
        public ELogResultaat MaakLog(string gebruikersnaam)
        {
            db = new DatabaseEntities();
            Log log = new Log();
            log.Datum = DateTime.Now;
            log.Inhoud = String.Format("Gebruiker {0} toegevoegd aan programma", gebruikersnaam);
            log.GebruikerGebruikersnaam = gebruikersnaam;
            db.AddToLogs(log);
            db.SaveChanges();
            return ELogResultaat.Succes;
        }

        /// <summary>
        /// Het creeëren van een log. Deze log wordt opgeslagen in de log database.
        /// </summary>
        /// <param name="logInfo">De inhoud van de log</param>
        /// <param name="gebruiker">De gebruikersnaam van de gebruiker</param>
        /// <param name="socialMedium">Enumtype van het SocialMedium waar een log van gemaakt is</param>
        /// <returns></returns>
        public ELogResultaat MaakLog(string logInfo, string gebruiker, ESocialMedium socialMedium)
        {
            ELogResultaat resultaat = new ELogResultaat();
            
            try
            {
                Log log = new Log();
                log.Inhoud = logInfo;
                log.Datum = DateTime.Now;
                log.GebruikerGebruikersnaam = gebruiker;
                log.SociaalMedium = socialMedium.ToString();
                db.AddToLogs(log);
                db.SaveChanges();
                resultaat = ELogResultaat.Succes;
            }
            catch
            {
                if (logInfo == string.Empty)
                    resultaat = ELogResultaat.LogInfoOngeldig;
                else if (controleerBestaandeNaam(gebruiker) == true)
                    resultaat = ELogResultaat.GebruikerOngeldig;
                else if (db.Connection.State != ConnectionState.Open)
                    resultaat = ELogResultaat.DatabaseNietToegankelijk;
            }
            return resultaat;
        }

        /// <summary>
        /// Autorisaties toevoegen voor gebruiker
        /// </summary>
        /// <param name="gebruikersnaam"></param>
        /// <param name="sM"></param>
        public void NieuweAutorisatieToevoegen(string gebruikersnaam, List<ESocialMedium> sM)
        {
           
        }

        internal List<List<string>> GetLogs(DateTime begintijd, DateTime eindtijd)
        {
            throw new NotImplementedException();
        }
    }
}